package  
{ 
	import caurina.transitions.Tweener;
	
	import flash.display.BlendMode;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;

	[SWF(width = "320", height = "240", backgroundColor = 0x0)] 
	
	public class WebGospelBackgroundHeartDraw extends MovieClip  
	{ 
		public function WebGospelBackgroundHeartDraw()
		{ 
			graphics.beginFill(0); 
			graphics.drawRect(0, 0, 320, 240);
			graphics.endFill();
			addEventListener(Event.ADDED_TO_STAGE,function(event:Event):void{
				startEffect();
			});
		}
		private function _startEffect(event:MouseEvent):void{
			var h:HeartSprite = new HeartSprite(); 
			h.blendMode = BlendMode.ADD; 
			h.x = mouseX; 
			h.y = mouseY; 
			h.scaleX *= (Math.random() * 0.5 + 0.75); 
			h.scaleY *= (Math.random() * 0.5 + 0.75); 
			h.rotation = (Math.random() - 0.5) * 60, 
				addChild(h); 
			Tweener.addTween(h, { 
				x: h.x + (Math.random() -0.5) * 300, 
				y: h.y + 200 + Math.random()*300, 
				scaleX: h.scaleX * 0.2, 
				scaleY: h.scaleY * 0.2, 
				rotation: h.rotation * (Math.random() * 1.5 + 1.5), 
				time: 2.0 + Math.random()*1.5, 
				transition: "easeInBack", 
				onComplete: function ():void  
				{ 
					removeChild(h); 
				} 
			});
		}
		public function startEffect():void{
			stage.addEventListener(MouseEvent.MOUSE_DOWN,_startEffect); 
		}
		public function stopEffect():void{
			stage.removeEventListener(MouseEvent.MOUSE_DOWN,_startEffect); 
		}
	}
} 
import flash.display.Graphics; 
import flash.display.Sprite; 
import flash.display.Shape; 
import flash.geom.Point; 
import caurina.transitions.Tweener; 
import flash.filters.BlurFilter; 

class HeartSprite 	extends Sprite 
{ 
	public var t:Number = 0; 
	public static var trans:Array = [ 
		"easeInOutQuad", 
		"linear", 
		"easeInCubic"//, 
		//      "easeOutCubic" 
	]; 
	private var fillShape:Shape = new Shape(); 
	public function HeartSprite():void  
	{ 
		
		scaleY *= -1; 
		if (Math.random() < 0.5) scaleX *= -1; 
		
		var h:HeartSegment = new HeartSegment(Math.random()*50 + 10); 
		var g:Graphics = graphics; 
		var g2:Graphics = fillShape.graphics; 
		var lastT:Number = 0; 
		var step:Number = 1 / 50; 
		
		g.lineStyle(Math.random() * 6 + 2,  
			(Math.random() * 0x66 + 0x99) << 16 | 
			(Math.random() * 0x66 + 0x99) << 8 | 
			(Math.random() * 0x66 + 0x99) 
		); 
		
		//set startPt to random 
		//      t = (Math.random() < 0.5) ? 0 : 0.5; 
		//      lastT = t; 
		//      var pt:Point = h.getValue(t); 
		//      g.moveTo( pt.x, pt.y); 
		//      g2.moveTo(pt.x, pt.y); 
		g2.beginFill( 
			(Math.random() * 0x3f + 0xc0) << 16 | 
			(Math.random() * 0x99) << 8 | 
			(Math.random() * 0x99) 
		); 
		
		filters = [ 
			new BlurFilter() 
		]; 
		
		Tweener.addTween(this, { 
			t:t+1, 
			time: 0.5 + Math.random()*1.0, 
			transition: trans[Math.floor(Math.random()*trans.length)], 
			onUpdate: function ():void  
			{ 
				while ((lastT += step) < t) 
				{ 
					var pt:Point = h.getValue(lastT); 
					g.lineTo( pt.x, pt.y); 
					g2.lineTo( pt.x, pt.y); 
					
				} 
				pt = h.getValue(t); 
				g.lineTo( pt.x, pt.y); 
				g2.lineTo( pt.x, pt.y); 
				lastT = t; 
			}, 
			onComplete: function ():void  
			{ 
				g.clear(); 
				addChild(fillShape); 
				
				fillShape.alpha = 0; 
				Tweener.addTween(fillShape, { 
					alpha:1.0, 
					scaleX: 1.2, 
					scaleY: 1.2, 
					time:0.5, 
					transition: "easeOutQuint" 
				}); 
			} 
		}); 
	} 
} 

class HeartSegment 
{ 
	private var len:Number; 
	private var bss:Array = []; 
	public function HeartSegment(len:Number = 30):void  
	{        
		this.len = len; 
		
		//--nodes 
		
		//bottom 
		var n0:Point = new Point(0, 0);      
		//left top 
		var n1:Point = Point.polar(len * 2 * (Math.random()* 0.5 +1), Math.PI * (7/12 + Math.random() * 1 / 6)); 
		//top 
		var n2:Point = new Point((Math.random()-0.5)*len*0.25, len * Math.sqrt(3)); 
		//right top 
		var n3:Point = Point.polar(len * 2 * (Math.random()* 0.5 +1), Math.PI *  (5/12 - Math.random() * 1 / 6)); 
		
		
		//--controls 
		var c10:Number = 0.5 + Math.random() * 1 / 6; 
		var c11:Number = 0.5 + Math.random() * 1 / 12; 
		
		var c20:Number = 0.5 - Math.random() * 1 / 12; 
		var c21:Number = 0.5 - Math.random() * 1 / 6; 
		
		var c00:Number = 0.5 + Math.random() * 1 / 6; 
		var c01:Number = c10 + 1; 
		
		var c30:Number = c21 + 1; 
		var c31:Number = 0.5 - Math.random() * 1 / 6; 
		
		
		//bezierSegments 
		bss = 
			[ 
				new BezierSegment_( 
					n0, 
					n0.add(Point.polar(len, Math.PI * c00)), 
					n1.add(Point.polar(len, Math.PI * c01)), 
					n1 
				), 
				new BezierSegment_( 
					n1, 
					n1.add(Point.polar(len, Math.PI * c10)), 
					n2.add(Point.polar(len, Math.PI * c11)), 
					n2 
				), 
				new BezierSegment_( 
					n2, 
					n2.add(Point.polar(len, Math.PI * c20)), 
					n3.add(Point.polar(len, Math.PI * c21)), 
					n3 
				), 
				new BezierSegment_( 
					n3, 
					n3.add(Point.polar(len, Math.PI * c30)), 
					n0.add(Point.polar(len, Math.PI * c31)), 
					n0 
				) 
			]; 
	} 
	public function getValue(t:Number):Point 
	{ 
		t -= Math.floor(t); 
		t *= bss.length; 
		var i:int = Math.floor(t); 
		return BezierSegment_(bss[i]).getValue(t-i); 
	} 
} 

/** 
 * A Bezier segment consists of four Point objects that define a single cubic Bezier curve. 
 * The BezierSegment class also contains methods to find coordinate values along the curve. 
 * @playerversion Flash 9.0.28.0 
 * @langversion 3.0 
 * @keyword BezierSegment, Copy Motion as ActionScript 
 * @see ../../motionXSD.html Motion XML Elements   
 */ 
class BezierSegment_ 
{ 
	public var a:Point; 
	public var b:Point; 
	public var c:Point; 
	public var d:Point; 
	function BezierSegment_(a:Point, b:Point, c:Point, d:Point) 
	{ 
		this.a = a; 
		this.b = b; 
		this.c = c; 
		this.d = d; 
	} 
	public function getValue(t:Number):Point 
	{ 
		var ax:Number = this.a.x; 
		var x:Number = (t*t*(this.d.x-ax) + 3*(1-t)*(t*(this.c.x-ax) + (1-t)*(this.b.x-ax)))*t + ax; 
		var ay:Number = this.a.y; 
		var y:Number = (t*t*(this.d.y-ay) + 3*(1-t)*(t*(this.c.y-ay) + (1-t)*(this.b.y-ay)))*t + ay; 
		return new Point(x, y);  
	} 
} 

